package com.ungao.tools.generator.rules;

import java.util.HashMap;
import java.util.Map;

public class MysqlColumnType implements IColumnType {
    private static final Map<String, String> FIELD_CACHE = new HashMap<>();
    private static final Map<String, String> JDBC_CACHE = new HashMap<>();

    private MysqlColumnType() {
        this.fieldCache();
        this.jdbcCache();
    }

    private void fieldCache() {
        FIELD_CACHE.put("INT", "java.lang.Integer");
        FIELD_CACHE.put("TINYINT", "java.lang.Integer");
        FIELD_CACHE.put("BIGINT", "java.lang.Long");
        FIELD_CACHE.put("DOUBLE", "java.lang.Double");
        FIELD_CACHE.put("FLOAT", "java.lang.Float");
        FIELD_CACHE.put("DECIMAL", "java.math.BigDecimal");
        FIELD_CACHE.put("DATE", "java.util.Date");
        FIELD_CACHE.put("TIMESTAMP", "java.util.Date");
        FIELD_CACHE.put("DATETIME", "java.util.Date");
        FIELD_CACHE.put("VARCHAR", "java.lang.String");
        FIELD_CACHE.put("CHAR", "java.lang.String");
        FIELD_CACHE.put("TEXT", "java.lang.String");
        FIELD_CACHE.put("LONGTEXT", "java.lang.String");
        FIELD_CACHE.put("BLOB", "java.lang.Byte[]");
    }

    private void jdbcCache() {
        //参考 org.apache.ibatis.type
        JDBC_CACHE.put("INT", "INTEGER");
        JDBC_CACHE.put("TINYINT", "TINYINT");
        JDBC_CACHE.put("BIGINT", "BIGINT");
        JDBC_CACHE.put("DOUBLE", "DOUBLE");
        JDBC_CACHE.put("FLOAT", "FLOAT");
        JDBC_CACHE.put("DECIMAL", "DECIMAL");
        JDBC_CACHE.put("DATE", "DATE");
        JDBC_CACHE.put("TIMESTAMP", "TIMESTAMP");
        JDBC_CACHE.put("DATETIME", "DATE");
        JDBC_CACHE.put("VARCHAR", "VARCHAR");
        JDBC_CACHE.put("CHAR", "CHAR");
        JDBC_CACHE.put("TEXT", "LONGVARCHAR");
        JDBC_CACHE.put("LONGTEXT", "VARCHAR");
        JDBC_CACHE.put("BLOB", "BLOB");
    }

    public static MysqlColumnType getInstance() {
        return Singleton.Instance;
    }

    private static class Singleton {
        private static final MysqlColumnType Instance = new MysqlColumnType();
    }

    @Override
    public String getFieldType(String columnType) {
        return FIELD_CACHE.get(columnType);
    }

    @Override
    public String getJdbcType(String jdbcType) {
        return JDBC_CACHE.get(jdbcType);
    }
}
